const db = require('../models/db')
const moment = require('moment')
const {imgPath} = require('../public/js/common')

//根据话题id获取指定话题
exports.one = async (req,res,next)=>{
  // console.log(req.params)
  const {id} = req.params;
  console.log(id);
  const sqlStr =
      `SELECT t.*,u.nickname 
      FROM topics AS t
      LEFT JOIN users AS u
      ON u.id = t.user_id
      WHERE t.id=${id}`;
  try {
    const [topic] = await db.query(sqlStr);
    topic.create_time = moment(topic.create_time).format('YYYY-MM-D HH:mm:ss');
    topic.modify_time = moment(topic.modify_time).format('YYYY-MM-D HH:mm:ss');
    console.log(topic);
    res.status(201).json(topic)
  } catch (err) {
    next(err)
  }
};

//获取所有话题
exports.list = async (req,res,next)=>{
  //_page 是当前页码
  //_limit = 20 是当前单页展示多少条数据

  let {_page = 1,_limit = 20} = req.query;

  if(_page < 0){
    _page = 1
  }
  if(_limit < 1){
    _limit = 1
  }
  if(_limit > 20){
    _limit = 20
  }

  //分页开始的索引,为sql语句的limit参数做准备
  const start = (_page - 1) * _limit;

  // 查询所有话题
  // topics表和comments表外连接，通过话题id找到对应的comments，统计评论个数
  const sqlStr =
      ` SELECT t.*,COUNT(c.article_id) AS comment_count,u.nickname,u.avatar
        FROM topics AS t
        LEFT JOIN comments AS c   
        ON t.id = c.article_id
        LEFT JOIN users AS u
        ON t.user_id = u.id
        GROUP BY t.id
        ORDER BY t.create_time DESC
        LIMIT ${start},${_limit}`;
  try {
    //查询话题的数量 count(*)
    const [{count}] = await db.query(`SELECT COUNT(*) AS count FROM topics`);
    // console.log(count);

    //查询语句返回数组
    const topics = await db.query(sqlStr);
    // console.log(topics);
    // 个人理解：mysql虽然在创建表的时候设置了时间字段的格式要求
    // 比如datetime，该字段的数据在数据库当中是以datetime格式展示的
    // 但是从数据库中查询结果返回给前端就会变成2021-05-12T21:50:48.000Z这种形式
    // 因此后端从数据库查询得到结果之后需要做一下处理
    // 使用对象展开符...，后面跟上需要修改的属性，就不需要把对象里面的所有属性都写一遍
    const newTopics = topics.map(item=>{
      return {...item,
        avatar:imgPath + item.avatar,
        create_time:moment(item.create_time).format('YYYY-MM-D HH:mm:ss'),
        modify_time:moment(item.modify_time).format('YYYY-MM-D HH:mm:ss')}

    });
    // console.log(newTopics);
    res.status(201).json({
      topics:newTopics,
      count:count
    })
  } catch (err) {
    next(err)
  }
};

//发起一个新的话题
exports.create =async (req,res,next)=>{
  //获取当前session中保存的用户
  // const {sessionUser} = req.session;

  //若当前无用户状态抛出未授权
  //这一个环节在很多地方都会用到，我们可以封装成函数
  // if(!sessionUser){
  //   return res.status(401).json({
  //     error:'Unauthorized'
  //   })
  // }


  //获取请求体
  const body = req.body;
  // console.log(req.session);

  //在请求体中加入当前用户id，这个id是通过session获取的
  body.user_id = req.session.sessionUser.id;

  //通过moment获取创建时间
  body.create_time = moment().format("YYYY-MM-D HH:mm:ss");

  //通过moment获取修改时间
  body.modify_time = moment().format("YYYY-MM-D HH:mm:ss");

  // console.log(body);
  // console.log(moment());
  //sql语句插入话题数据
  const sqlStr =
      `INSERT INTO topics(title,content,user_id,create_time,modify_time)
   VALUES('${body.title}',
          '${body.content}',
          '${body.user_id}',
          '${body.create_time}',
          '${body.modify_time}')`;
  //利用try-catch捕获异常
  try {
    //获取插入话题数据之后返回的sql数据
    //result是okpocket
    const result = await db.query(sqlStr);
    const [topic] = await db.query(`SELECT * FROM topics WHERE id = ${result.insertId}`);
    res.status(201).json(topic)
  } catch(err) {
    next(err)
  }
};

//更新话题
exports.update =async (req,res,next)=>{
  try {
    //这里其实还有2种情况需要判断
    //1.判断当前资源是否存在
    //2.判断当前用户是否是该话题的创作者，是否有权限进行更新
    //以上两步在更新话题和删除话题中都有使用到，所以提取成为中间件，在router.js中做统一提前处理

    //获取请求参数(动态路由id),拿到当前需要被更新的话题的id
    const {id} = req.params;

    //获取请求体里面的更新后的title和content
    // console.log(req.body)
    const {title,content} = req.body;

    //需要处理修改时间
    const modify_time = moment().format('YYYY-MM-DD HH:mm:ss');
    console.log(modify_time);
    

    //根据当前id去寻找对应的话题
    //这里的sql语句有好几个坑：1.set后面处理不同字段需要写逗号分开 2.数据需要字符串形式
    const sqlStr =
        `UPDATE topics 
         SET title='${title}',content='${content}',modify_time='${modify_time}'
         WHERE id=${id}`;
    //执行sql的更新语句
    const result = await db.query(sqlStr);
    //更新之后
    const [newTopic] = await db.query(`SELECT * FROM topics WHERE id=${id}`);
    console.log(newTopic);
    //更新成功之后，返回更新后的对象
    res.status(201).json(newTopic)
  } catch (err) {
    next(err)
  }
};

//删除话题
exports.destroy =async (req,res,next)=>{
  //查询字符串：也就是url中?_page=1&limit=5这种，使用req.query
  //post请求体：使用req.body
  //动态路由参数：也就是url中http://localhost:3000/topics/:id这种，使用req.params

  try {
    //这里其实还有2种情况需要判断
    //1.判断当前资源是否存在
    //2.判断当前用户是否是该话题的创作者，是否有权限删除
    //以上两步在更新话题和删除话题中都有使用到，所以提取成为中间件，在router.js中做统一提前处理


    //获取请求体,拿到当前需要被删除的话题的id
    const {id} = req.params;

    //根据当前id去删除对应的话题
    const sqlStr =
        `DELETE FROM topics 
         where id=${id}`;
    //执行sql语句
    const result = await db.query(sqlStr);
    //删除成功之后，返回空对象
    res.status(201).json({})
  } catch (err) {
    next(err)
  }
}